/**
 * Importação das bibliotecas necessárias para a implementação da classe.
 */
import org.jfree.chart.*;
import org.jfree.chart.axis.*;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.CandlestickRenderer;
import org.jfree.data.xy.*;
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.net.URL;
import java.text.*;
import java.util.*;
import java.util.List;

/**
 * 
 * Universidade de Brasília - Gama
 * Sistema de Análise de Investimentos de Bolsa de Valores - Projeto de Técnicas de Programação
 * @author Filipe Barbosa de Almeida - 09/0006097
 * @author Gabriela Matias Navarro - 09/0006526
 * @author Renato Guibson Girardi - 09/0013204
 */
public class Grafico extends JFrame{
  
    /**
     * Método construtor da classe Grafico
     * @param acao 
     */
 public Grafico(String acao) {
     
        super("Grafico");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        DateAxis    domainAxis       = new DateAxis("Date");
        NumberAxis  rangeAxis        = new NumberAxis("Price");
        CandlestickRenderer renderer = new CandlestickRenderer();
        XYDataset   dataset          = getDataSet(acao);

        XYPlot mainPlot = new XYPlot(dataset, domainAxis, rangeAxis, renderer);

        /**
         * Do some setting up, see the API Doc
         */
        renderer.setSeriesPaint(0, Color.BLACK);
        renderer.setDrawVolume(false);
        rangeAxis.setAutoRangeIncludesZero(false);
        domainAxis.setTimeline( SegmentedTimeline.newMondayThroughFridayTimeline() );

        /**
         * Criando o gráfico no painel gráfico
         */
        JFreeChart chart = new JFreeChart(acao, null, mainPlot, false);
        ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new Dimension(739, 352));

        this.add(chartPanel);
        this.pack();
    }
    protected AbstractXYDataset getDataSet(String acao) {
        /**
         * Conjunto de dados a ser criado
         */
        DefaultOHLCDataset result = null;
        /**
         * Dados necessários para o conjunto de dados
         */
        OHLCDataItem[] data;

        /**
         * Obtendo dados
         */
        data = getData(acao);

        /**
         * Criando um conjunto de dados
         */
        result = new DefaultOHLCDataset(acao, data);

        return result;
    }
    /**
     * Este método usa a yahoo finanças para obter os dados OHLC
     * @param acao
     * @return 
     */
    protected OHLCDataItem[] getData(String acao) {
        List<OHLCDataItem> dataItems = new ArrayList<OHLCDataItem>();
        try {
            String strUrl= "http://ichart.finance.yahoo.com/table.csv?s="+acao+"&a=0&b=1&c=2008&d=3&e=30&f=2008&ignore=.csv";
            URL url = new URL(strUrl);
            BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
            DateFormat df = new SimpleDateFormat("y-M-d");

            String inputLine;
            in.readLine();
            while ((inputLine = in.readLine()) != null) {
                StringTokenizer st = new StringTokenizer(inputLine, ",");

                Date date       = df.parse( st.nextToken() );
                double open     = Double.parseDouble( st.nextToken() );
                double high     = Double.parseDouble( st.nextToken() );
                double low      = Double.parseDouble( st.nextToken() );
                double close    = Double.parseDouble( st.nextToken() );
                double volume   = Double.parseDouble( st.nextToken() );
                double adjClose = Double.parseDouble( st.nextToken() );

                OHLCDataItem item = new OHLCDataItem(date, open, high, low, close, volume);
                dataItems.add(item);
            }
            in.close();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        //Data from Yahoo is from newest to oldest. Reverse so it is oldest to newest
        Collections.reverse(dataItems);

        /**
         * Convertendo a lista em um array
         */
        OHLCDataItem[] data = dataItems.toArray(new OHLCDataItem[dataItems.size()]);

        return data;
    }
    /*
    public static void main(String[] args) {
        new Grafico("MSFT").setVisible(true);
    }
     * 
     */
}